package link;

import java.util.LinkedList;

/**
 * 链表
 */
public class MainFrame {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        test4();
        test5();
    }

    private static void test1(){
        System.out.println("单向链表： start");
        SingleLinkList linkList = new SingleLinkList();
        linkList.add("1");
        linkList.add(true);
        linkList.add("3");
        System.out.println(linkList.toString());
        linkList.set(1, "2");
        System.out.println(linkList.toString());
        linkList.add(3, "5");
        System.out.println(linkList.toString());
        System.out.println(linkList.get(0).data);
        System.out.println(linkList.indexOf("1"));
        System.out.println(linkList.indexOf("5"));
        System.out.println(linkList.indexOf("4"));
        linkList.remove(0);
        System.out.println(linkList.toString());
        System.out.println("单向链表： end");
        System.out.println("");
    }

    private static void test2(){
        System.out.println("双向链表： start");
        DoubleLinkList  linkedList = new DoubleLinkList();

        //测试数据插入
        linkedList.add("1");
        linkedList.add("2");
        linkedList.add("3");
        linkedList.add("4");
        System.out.println(linkedList.toString());
        System.out.println(linkedList.get(1));
        System.out.println(linkedList.indexOf("1"));
        linkedList.set(0,"0");
        System.out.println(linkedList.toString());
        linkedList.add(1,"5");
        System.out.println(linkedList.toString());
        System.out.println(linkedList.remove(1));
        System.out.println(linkedList.toString());
        System.out.println(linkedList.getFirst());
        System.out.println(linkedList.getLast());
        System.out.println("双向链表： end");
        System.out.println("");
    }

    private static void test3(){
        /**
         * 约瑟夫问题:
         *
         *  41个人坐一圈，第一个人编号为1，第二个人为2，第n个人的编号为n。
         * 编号为1的人开始从1报数，依次向后，报数为3的那个人出圈
         * 自退出那个人开始的下一个人再次从1开始报数，以此类推
         * 求最后退出的那个人的编号（最后出圈的人就不用si了）
         */
        System.out.println("约瑟夫问题（环）： start");
        CycleLinkList cycleLinkList = new CycleLinkList();
        cycleLinkList.initJosephus(41, 3);
        System.out.println("约瑟夫问题（环）： end");
        System.out.println("");
    }

    private static void test4(){
        System.out.println("单向循环链表： start");
        CycleSingleLinkList linkList = new CycleSingleLinkList();
        linkList.add("1");
        linkList.add("2");
        linkList.add("3");
        System.out.println(linkList.toString());
        linkList.add(1, "5");
        System.out.println(linkList.toString());
        linkList.set(1, "6");
        System.out.println(linkList.toString());
        System.out.println(linkList.get(0));
        System.out.println(linkList.indexOf("3"));
        System.out.println(linkList.indexOf("4"));
        linkList.remove(0);
        System.out.println(linkList.toString());
        System.out.println("单向循环链表： end");
        System.out.println("");
    }

    private static void test5(){
        System.out.println("双向循环链表： start");
        CycleDoubleLinkList  linkedList = new CycleDoubleLinkList();

        //测试数据插入
        linkedList.add("1");
        linkedList.add("2");
        linkedList.add("3");
        linkedList.add("4");
        System.out.println(linkedList.getFirst());
        System.out.println(linkedList.getLast());
        System.out.println(linkedList.toString());
        System.out.println(linkedList.length());
        System.out.println(linkedList.get(0));
        System.out.println(linkedList.indexOf("1"));
        linkedList.add(2,"5");
        System.out.println(linkedList.toString());
        linkedList.set(2,"6");
        System.out.println(linkedList.toString());
        System.out.println(linkedList.remove(4));
        System.out.println(linkedList.toString());
        System.out.println("双向循环链表： end");
        System.out.println("");
    }
}
